#include "conjunto.h"
#include <iostream>
#include "defines.h"
#include <sstream>
#include <string>
#include <cassert>
#include <cstdlib>

using namespace std;

template<class T>
void asegurar(const Conjunto<T>& l, string s) {
	ostringstream out;
	l.mostrarConjunto(out);
	string t = out.str();
	if (s != t) {
		cerr << s << " != " << t << endl;
		assert(false);
	}
}

template<class T>
void asegurar(const Conjunto<T>& l, const Conjunto<T>& lp) {
	ostringstream out;
	lp.mostrarConjunto(out);
	asegurar(l, out.str());
}

template<class T>
void asegurarPertenece(const Conjunto<T>& l,const T& t ,bool s) {
	if (l.pertenece(t)!=s) {
		cerr << t << " No Pertenece a " << l << endl;
		assert(false);
	}
}


#define RUNTEST(t) { cerr << "Corriendo test " << #t << endl; t (); cerr << "Terminado test " << #t << endl; }

void TestVacio(){
	Conjunto<int> c1;
  	 Conjunto<int> c2;
  	 Conjunto<int> c3;
	asegurar(c1,"[]");
	asegurar(c2,"[]");
	asegurar(c3,"[]");
	assert(!c1.pertenece(rand()));
}

void TestPertenece(){
	Conjunto<int> c1;
   	Conjunto< Conjunto<int> > c2;
	Conjunto<int> c3;

/////////////////////////////////////////////  
/////////*AGREGO ELEMENTOS A C1 *////////////
/////////////////////////////////////////////  

	c1.agregar(9);		//Agrego el 3 a c1
	//Me fijo si c1 = [9]    
	assert(c1.pertenece(9));

	c1.agregar(3);		//Agrego el 3 a c1
	//Me fijo si c1 = [3,9] porque como es conjunto no hay repetidos.
	assert(c1.pertenece(9));	
	assert(!c1.pertenece(8));	

 	c1.agregar(7);		//Agrego el 7 a c1
	//Me fijo si c1 = [7,3] 
	assert(c1.pertenece(7));	//Me fijo si c1 = [7,3] 

/////////////////////////////////////////////  
/////////*AGREGO ELEMENTOS A C3 *////////////
/////////////////////////////////////////////   

	c3.agregar(2);		//Agrego el 2 a c3
	//Me fijo si c3 = [2]
	assert(c3.pertenece(2));   

	c3.agregar(30);		//Agrego el 30 a c3
	//Me fijo si c3 = [30,2]
	assert(c3.pertenece(30));    

	c3.agregar(55);			//Agrego el 55 a c3
	//Me fijo si c3 = [55,30,2]
	assert(c3.pertenece(55)); 
	   
	c3.agregar(302);		//Agrego el 302 a c3
	//Me fijo si c3 = [302,55,30,2]
	assert(c3.pertenece(302)); 
	   
	c3.agregar(42);			//Agrego el 42 a c3
	//Me fijo si c3 = [42,302,55,30,2]
	assert(c3.pertenece(42)); 	   

/////////////////////////////////////////////  
/////////*AGREGO ELEMENTOS A C2 *////////////
/////////////////////////////////////////////   

	c2.agregar(c1);		//Agrego el c1 a c2
	//Me fijo si c2 = [[7,3]]
 	assert(c2.pertenece(c1)); 
	
	c2.agregar(c3);			//Agrego el c3 a c2
	//Me fijo si c2 = [[42,302,55,30,2],[7,3]]
	assert(c2.pertenece(c3));
	
   
/*ACA ME FIJO LOS PERTENECE SI FUNCIONAN */
/* Mis Conjuntos quedaron
	c1 = [7,3]
	c2 = [[7,3],[42,302,55,30,2],[7,3]]
	c3 = [42,302,55,30,2]

asegurar(conjunto,elemento a ver si pertenece o no, si pertenece o no lo sabemos nosotros)
*/
   // Probando Pertenece en c1
	asegurarPertenece(c1,2,false);
	asegurarPertenece(c1,3,true);
	asegurarPertenece(c1,112,false);
	asegurarPertenece(c1,7,true); 

   //PROBANDO PERTENECE en C2
	asegurarPertenece(c2,c1,true);
	asegurarPertenece(c2,c3,true);
	
   
   
   //PROBANDO PERTENECES EN c3  
	asegurarPertenece(c3,2,true);
	asegurarPertenece(c3,30,true);
	asegurarPertenece(c3,5,false);
	asegurarPertenece(c3,42,true);
	asegurarPertenece(c3,402,false);
	asegurarPertenece(c3,55,true);
	asegurarPertenece(c3,102030145,false);
   
}


int main(){
  	RUNTEST (TestVacio); 
	RUNTEST (TestPertenece);
   return 0;
}
